#include<iostream>
using namespace std;

/*运算符重载函数
1.成员函数重载的解析：第一个操作数作为当前对象，第二个操作数作为参数；
2.全局函数重载的解析：两个操作数都作为参数；
3.友元函数重载的解析：两个操作数都作为参数。
4.注意：能用成员函数优先使用成员函数。
  e.g  c1 + c2  成员函数  友元函数
	   c1 + 6   成员函数  友元函数
	   6 + c1   友元函数
5.不能重载的运算符：
  (1) ?:[条件运算符]  (2) ::[即在类外实现成员函数时的操作符]  (3) .[即对象.成员函数的.]  (4) sizeof
6.系统自动定义的运算符： = [赋值运算符]
7.只能重载为类的成员函数的运算符：
  (1) =[赋值运算符]  (2) ()[函数调用操作符]  (3) [][数组的下标运算符]  (4) ->[结构体的成员访问运算符]
【注】：下方有用友元函数实现操作符 << 和操作符 >> 的重载 
*/

/*class Com
{
	int shi;
	int xv;
public:
	Com(int s = 0, int x = 0)
	{
		shi = s;
		xv = x;
	}
	//成员函数重载
	Com operator+(const Com &c)
	{
		Com sum; //可以不传参，因为构造函数有默认参数
		sum.shi = shi + c.shi;
		sum.xv = xv + c.xv;
		return sum;
	}
	void show()
	{
		cout<<shi<<"+"<<xv<<"i"<<endl;
	}
	int getshi(){return shi;}//获取值
	int getxv(){return xv;}
	
	void setshi(int s)//赋值
	{
		shi = s;
	}
	void setxv(int x)
	{
		xv = x;
	}
	
	friend Com operator+(const Com &c1, const Com &c2);
};

//全局函数
Com operator+(int k, Com c)
{
	Com sum;
	sum.setshi(k + c.getshi());
	sum.setxv(c.getxv());
	return sum;
}

//友元函数
Com operator+(const Com &c1, const Com &c2)
{
	Com sum;
	sum.shi = c1.shi + c2.shi;
	sum.xv = c1.xv + c2.xv;
	return sum;
}

int main()
{
	Com c1(4, 5), c2(2, 3), c3;
	
	c3 = c2 + 7;//此处的 7 自动转化为函数中的 c.shi
	//7+c1; 错误：第一个操作数必须是对象。
	cout<<"c3 = ";
	c3.show();
	c3 = operator+(7, c2);
	cout<<"c3 = ";
	c3.show();
	
	return 0;
}*/

//！！！用友元函数实现操作符 << 和操作符 >> 的重载
/*class com
{
	int shi;
	int xv;
public:
	com(int s = 0, int x = 0)
	{
		shi = s;
		xv = x;
	}
	friend void operator>>(istream &in, com &c1);
	friend void operator<<(ostream &out, com &c1);
};

//友元函数
void operator>>(istream &in, com &c1)
{
	in>>c1.shi>>c1.xv;
}
void operator<<(ostream &out, com &c1)
{
	out<<c1.shi<<"+"<<c1.xv<<"i"<<endl;
}

int main()
{
	com c1;
	cin>>c1;//解析为 operator>>(cin, c1);[不能写为成员函数，要写为友元函数，理由如下：]
		    //[无法解析为cin.operator(c1); 因为cin并不是com类内的对象，而是istream类内的对象，
	        //按理说这个运算符重载函数应该写在istream类内，而istream是库里的类，不能在其中写新的成员函数]
    // cin 是一个名为 istream 的类内的对象 in ，这个类是iostream库里的类
	cout<<c1;//解析为 operator<<(cin, c1);[理由同上] 
    // cout 是一个名为 ostream 的类内的对象 out ，这个类也是iostream库里的类
	return 0;
}*/
